﻿namespace nCodeGeneratingTool
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Xml;
    using System.Xml.XPath;
    using System.Xml.Xsl;

    public static class CodeGen
    {
        #region Properties

        public static string ડેટાબેઝજોડાણશબ્દમાળા
        {
            get;
            set;
        }

        #endregion Properties

        #region Methods

        public static XsltArgumentList આદેશનામયાદીબનાવો(List<string> આદેશનામયાદી)
        {
            XsltArgumentList દલીલો = new XsltArgumentList();
            foreach (string આદેશ in આદેશનામયાદી)
            {
                try
                {
                    if (આદેશ != "ObjectToOperate")
                    {
                        Console.Write(આદેશ + ":");
                        string value = Console.ReadLine().Trim();
                        string[] values = આદેશ.Split(':');
                        દલીલો.AddParam(આદેશ.Trim(), string.Empty, value);
                    }
                }
                catch (Exception ex)
                {
                }
            }
            return દલીલો;
        }

        public static XsltArgumentList આદેશનામયાદીબનાવો(string આદેશનામયાદી)
        {
            XsltArgumentList દલીલો = new XsltArgumentList();
            foreach (string આદેશ in આદેશનામયાદી.Split('|'))
            {
                try
                {
                    string[] આદેશનામ = આદેશ.Split(':');
                    દલીલો.AddParam(આદેશનામ[0].Trim(), string.Empty, આદેશનામ[1].Trim());
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return દલીલો;
        }

        public static string કોડબનાવો(string સંગ્રહિતકાર્યપ્રણાલીનામ, string XSLTફાઇલ, string આદેશ, string ડીબીસર્વરવિગતો, string XSLTફોલ્ડર)
        {
            try
            {
                //Code to process entire file at a time.
                List<string> આદેશનામયાદી = new List<string>();
                આદેશનામયાદી.Add(આદેશ.Trim());
                string બનાવેલોકોડ = string.Empty;
                foreach (string ટેબલનામ in આદેશનામયાદી)
                {
                    Console.WriteLine("Processing... " + ટેબલનામ);
                    //string tableName = args[1];

                    ડેટાબેઝજોડાણશબ્દમાળા = ડીબીસર્વરવિગતો; //GenerateDBConnectionString(dbServerDetails.Split(','));

                    DataSet ડેટાસેટ = new DataSet("DataSet");

                    DataTable dt = કોષ્ટકકોલમડેટામેળવો(ટેબલનામ, સંગ્રહિતકાર્યપ્રણાલીનામ);

                    ડેટાસેટ.Tables.Add(dt);
                    List<string> આદેશનામયાદી2 = બધાપરિમાણોમેળવો(XSLTફાઇલ, XSLTફોલ્ડર);
                    string body;
                    if (આદેશનામયાદી2.Count > 0)
                    {
                        XsltArgumentList દલીલો = આદેશનામયાદીબનાવો(આદેશનામયાદી2);
                        દલીલો.AddParam("ObjectToOperate", string.Empty, ટેબલનામ);
                        body = ડેટાસેટમદદથીXSLTબનાવો(ડેટાસેટ, XSLTફોલ્ડર + "\\nCodeGeneratorFiles\\" + XSLTફાઇલ, દલીલો);
                    }
                    else
                    {
                        body = ડેટાસેટમદદથીXSLTબનાવો(ડેટાસેટ, XSLTફોલ્ડર + "\\nCodeGeneratorFiles\\" + XSLTફાઇલ, null);
                    }
                    બનાવેલોકોડ += body.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty) + "\n";

                }
                //List<string> lines = File.ReadAllLines(args[0]).ToList();
                //lines[Convert.ToInt32(args[3]) - 1] = GeneratedClassData;
                return બનાવેલોકોડ;
                //File.WriteAllLines(args[0], lines);

                //System.Threading.Thread.Sleep(500);
                //Console.WriteLine("SP Generated Successfully.");
            }
            catch (Exception ex)
            {
                Console.WriteLine("ભૂલ " + ex.Message);
                return "ભૂલ કોડ : " + ex.Message + " : " + ex.StackTrace;
            }
        }

        public static DataTable કોષ્ટકકોલમડેટામેળવો(string કામકરવામાટેઓબ્જેક્ટ, string સંગ્રહિતકાર્યપ્રણાલીનામ)
        {
            SqlParameter પરિમાણકામકરવામાટેઓબ્જેક્ટ = DALHelper.SqlParameter("ObjectToOperate", SqlDbType.NVarChar, કામકરવામાટેઓબ્જેક્ટ);

            // "દાખલ કરો" અને "સુધારા" ક્વેરી માટે વાપરી શકાય
            DataSet પરિણામ = new DALHelper(ડેટાબેઝજોડાણશબ્દમાળા).ExecuteProcedureReader("[dbo].[" + સંગ્રહિતકાર્યપ્રણાલીનામ + "]", પરિમાણકામકરવામાટેઓબ્જેક્ટ);
            DataTable dt = પરિણામ.Tables[0];
            પરિણામ.Tables.Remove(dt);
            return dt;
        }

        public static string ડેટાબેઝજોડાણશબ્દમાળાબનવો(string[] ડીબીસર્વરવિગતો)
        {
            return "Data Source=" + ડીબીસર્વરવિગતો[0] + ";Initial Catalog=" + ડીબીસર્વરવિગતો[1] + ";Integrated Security=True";
        }

        public static string ડેટાસેટમદદથીXSLTબનાવો(DataSet xmlDataSet, string templateFile, XsltArgumentList arguments)
        {
            string body = string.Empty;
            string xsltFilePath = templateFile;

            string xml = xmlDataSet.GetXml();
            //XmlDataDocument xmlLocations = new XmlDataDocument(xmlDataSet);

            //StringReader sr = new StringReader(xmlDataSet.GetXml());
            //XPathDocument doc = new XPathDocument(sr);

            // Load XML
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            XPathNavigator nav = doc.CreateNavigator();

            // Stream for the transformed XML
            using (MemoryStream stream = new MemoryStream())
            {
                try
                {
                    XmlWriter writer = new XmlTextWriter(Console.Out);

                    // Load XSLT & transform
                    XslCompiledTransform transformer = new XslCompiledTransform();
                    transformer.Load(xsltFilePath);
                    transformer.Transform(doc.CreateNavigator(), arguments, stream);
                }
                catch (Exception ex) { throw ex; }
                // Write output
                using (StreamReader reader = new StreamReader(stream))
                {
                    stream.Position = 0;
                    body = reader.ReadToEnd();
                    reader.Close();
                }
            }
            return body;
        }

        public static List<string> બધાપરિમાણોમેળવો(string XSLTફાઇલ, string XSLTફોલ્ડર)
        {
            List<string> પરિમાણો = new List<string>();
            string ફાઈલનાસમાવિષ્ટો = File.ReadAllText(XSLTફોલ્ડર + "\\nCodeGeneratorFiles\\" + XSLTફાઇલ);
            Regex test = new Regex(@"<xsl:value-of select=""(.*?)""/>");

            foreach (Match સંબંધિત in test.Matches(ફાઈલનાસમાવિષ્ટો))
            {
                string સંબંધિતવસ્તુ = સંબંધિત.Groups[1].Value;
                if (સંબંધિતવસ્તુ.StartsWith("$"))
                {
                    if (!પરિમાણો.Contains(સંબંધિતવસ્તુ.Replace("$", "")))
                    {
                        પરિમાણો.Add(સંબંધિતવસ્તુ.Replace("$", ""));
                        //columnsList += match.Groups[1].Value + ",";
                    }

                }
            }
            return પરિમાણો;
        }

        #endregion Methods
    }
}